package ring.compiler;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
/**
* Class to validate documents during the "compilation" process. This class is NOT
* thread-safe.
* @author projectmoon
*
*/
public class DocumentValidator {
private static final Schema SCHEMA = loadSchema();
private DocumentErrorHandler errorHandler = null;
private static Schema loadSchema() {
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
factory.setResourceResolver(new ResourceResolver());
InputStream stream1 = DocumentValidator.class.getClassLoader().getResourceAsStream("ring/nrapi/xml/schema1.xsd");
InputStream stream2 = DocumentValidator.class.getClassLoader().getResourceAsStream("ring/nrapi/xml/schema2.xsd");
StreamSource input1 = new StreamSource(stream1);
StreamSource input2 = new StreamSource(stream2);
try {
return factory.newSchema(new Source[] { input1, input2 });
}
catch (SAXException e) {
e.printStackTrace();
}
return null;
}
public boolean validate(File file) throws IOException {
FileInputStream input = new FileInputStream(file);
StreamSource src = new StreamSource(input);
errorHandler = new DocumentErrorHandler();
Validator validator = SCHEMA.newValidator();
validator.setErrorHandler(errorHandler);
try {
validator.validate(src);
return true;
}
catch (SAXException e) {
return false;
}
}
public List<ValidationError> getErrors() {
return errorHandler.getErrors();
}
}